#include "pch.h"

#include "math/vector3.h"
#include "core/config.h"


#ifdef RE_USE_DX


namespace Math
{

	//////////////////////////////////////////////////////////////////////////
	vector3::vector3():
float4(0.0f,0.0f,0.0f,0.0f)
{

}


//////////////////////////////////////////////////////////////////////////
vector3::vector3(scalar x, scalar y, scalar z):
float4(x,y,z,0.0f)
{

}


//////////////////////////////////////////////////////////////////////////
vector3::vector3(const Math::float4 &rhs):
float4(rhs)
{

}





//////////////////////////////////////////////////////////////////////////
void vector3::operator =(const Math::vector3 &rhs)
{
	this->m_vec = rhs.m_vec;
}


//////////////////////////////////////////////////////////////////////////
bool vector3::operator ==(const vector3 & rhs) const 
{
	return (0 != XMVector3Equal(this->m_vec, rhs.m_vec));
}


//////////////////////////////////////////////////////////////////////////
bool vector3::operator !=(const vector3 & rhs) const 
{
	return (0 != XMVector4NotEqual(this->m_vec, rhs.m_vec));
}


//////////////////////////////////////////////////////////////////////////
void vector3::operator *=(scalar s)
{
	this->m_vec = XMVectorScale(this->m_vec, s);
}


//////////////////////////////////////////////////////////////////////////
void vector3::operator +=(const vector3 & rhs)
{
	this->m_vec = XMVectorAdd(this->m_vec, rhs.m_vec);
}


//////////////////////////////////////////////////////////////////////////
void vector3::operator -=(const vector3 & rhs)
{
	this->m_vec = XMVectorSubtract(this->m_vec, rhs.m_vec);
}


//////////////////////////////////////////////////////////////////////////
vector3 vector3::operator - () const 
{
	return XMVectorNegate(this->m_vec);
}


///
vector3 vector3::operator -(const vector3 & rhs) const 
{
	return XMVectorSubtract(this->m_vec, rhs.m_vec);
}


//////////////////////////////////////////////////////////////////////////
vector3 vector3::operator +(const vector3 & rhs) const
{
	return XMVectorAdd(this->m_vec, rhs.m_vec);
}


//////////////////////////////////////////////////////////////////////////
vector3 vector3::operator *(scalar s) const 
{
	return XMVectorScale(this->m_vec, s);
}




//////////////////////////////////////////////////////////////////////////
void vector3::set(scalar x, scalar y, scalar z)
{
	this->m_vec = XMVectorSet(x, y, z, 0.0f);
}





//////////////////////////////////////////////////////////////////////////
vector3 vector3::nullvec()
{
	return vector3(0.0f,0.0f,0.0f);
}


//////////////////////////////////////////////////////////////////////////
vector3 vector3::upvec()
{
	return vector3(0.0f,1.0f,0.0f);
}

}

#endif // RE_USE_DX